package cn.bonoon.kernel.menus;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import cn.bonoon.kernel.security.PrivilegeChecker;
import cn.bonoon.kernel.util.MD5Util;
import cn.bonoon.kernel.util.StringHelper;


public class ChannelInfo extends ItemInfo {
	public ChannelInfo(){}
	
	public ChannelInfo(int ordinal, String id, String name){
		this.id = id;
		this.name = name;
		this.ordinal = ordinal;
	}
	
	protected List<TabInfo> tabs;

	@Override
	public ChannelInfo getChannel() {
		return this;
	}

	/**
	 * 这里返回的一定不会是null
	 * @return
	 */
	public List<TabInfo> getTabs() {
		return tabs;
	}
	
	public void add(TabInfo tab){
		if(null == tabs){
			tabs = new ArrayList<TabInfo>();
		}
		tabs.add(tab);
	}
	
	@Override
	protected void buttonName(StringBuilder a) {
		a.append("<span>").append(name).append("</span>");
	}
	
	//TODO 使用递归访问所有的子菜单，并找出可以访问的子菜单出来   这里需要修改，在3.1版本中
	private boolean __visit(List<MenuInfo> menus, PrivilegeChecker privilege, StringBuilder a){
		for(MenuInfo mi : menus){
			//找出第一个有权限的子菜单
			if(privilege.hasPrivilege(mi)){
				if("javascript:void(null);".equals(mi.href)){
					if(__visit(mi.menus, privilege, a)){
						return true;
					}
				}else{
					_button(mi.href, a, "");
					return true;
				}
			}
		}
		return false;
	}
	
	public void button(PrivilegeChecker privilege, StringBuilder a) {
		if(StringHelper.isNotEmpty(href)){
			_button(href, a, "");
		}else{
//			for(MenuInfo mi : menus){
//				//找出第一个有权限的子菜单
//				if(privilege.hasPrivilege(mi)){
//					if(StringHelper.isNotEmpty(mi.href)){
//						_button(mi.href, a, "");
//						return;
//					}else{
//						for(MenuInfo imi : mi.menus){
//							
//						}
//					}
//					return;
//				}
//			}
			if(!__visit(menus, privilege, a)){
				//在tabs里查找是否有权限
				for(TabInfo ti : tabs){
					if(privilege.hasPrivilege(ti)){
						_button(ti.href, a, "");
						return;
					}
				}
			}
		}
	}
	@Override
	protected void init(IModuleContext context, IModuleInfo module, Map<String, ItemInfo> itemCached, String pid, String phref) {
		navigation = name;
		super.init(context, module, itemCached, pid, phref);
		//TODO 应该在后面追加定义的tabs的菜单
		if(null != tabs){
			for(TabInfo ti : tabs){
				String tid = key + '-' + ti.getId();
				ti.setId(MD5Util.getMD5(tid));
				ti.navigation = navigation + ">>" + ti.getName();
				ti.href = context.tabPath(ti.getId());
				ti.module = module;
				ti.channel = this;
				if(StringHelper.isEmpty(ti.title)){
					ti.title = ti.getName();
				}
				context.add(ti.init());
				for(TabItem tab : ti.items){
					tab.setId(MD5Util.getMD5(tid + '-' + tab.getId()));
					tab.init(context);
					context.add(tab);
				}
				Collections.sort(ti.items);
			}
			Collections.sort(tabs);
		}else{
			tabs = Collections.emptyList();
		}
	}
}
